package com.greenold.service.service.impl;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

import com.greenold.common.utils.SecurityUtils;
import com.greenold.service.domain.CareItem;
import com.greenold.service.domain.CarePlanItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;

import com.greenold.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.greenold.service.mapper.CarePlanMapper;
import com.greenold.service.domain.CarePlan;
import com.greenold.service.service.ICarePlanService;

/**
 * 护理计划Service业务层处理
 *
 * @author YueYang
 * @date 2025-10-13
 */
@Service
public class CarePlanServiceImpl implements ICarePlanService {
    @Autowired
    private CarePlanMapper carePlanMapper;


    /**
     * 查询护理计划列表
     *
     * @param carePlan 护理计划
     * @return 护理计划
     */
    @Override
    public List<CarePlan> selectCarePlanList(CarePlan carePlan) {
        return carePlanMapper.selectCarePlanList(carePlan);
    }

    /**
     * 查询护理计划
     *
     * @param id 护理计划主键
     * @return 护理计划
     */
    @Override
    public CarePlan selectCarePlanById(String id) {
        return carePlanMapper.selectCarePlanById(id);
    }

    /**
     * 新增护理计划
     *
     * @param carePlan 护理计划
     * @return 结果
     */
    @Transactional
    @Override
    public int insertCarePlan(CarePlan carePlan) {
        //获取当前后端登录用户
        Long userId = SecurityUtils.getUserId();
        //设置创建人
        carePlan.setCreateBy(String.valueOf(userId));
        //设置更新人
        carePlan.setUpdateBy(String.valueOf(userId));
        //设置更新时间
        carePlan.setUpdateTime(new Date());
        //设置创建时间
        carePlan.setCreatedAt(new Date());


        //新增护理计划 先新增护理计划 在新增护理项目关联表
        int rows = carePlanMapper.insertCarePlan(carePlan);
        //新增护理项目关联表中护理计划和项目的关联
        List<CarePlanItem> careItemList = carePlan.getCarePlanItemList();
        //批量新增关联关系
        if (careItemList != null && !careItemList.isEmpty()) {
            //为每项添加护理计划id
            for (CarePlanItem item : careItemList) {
                item.setPlanId(Long.parseLong(carePlan.getId()));
            }
            //批量新增护理计划项目关联关系
            rows += carePlanMapper.batchCarePlanItem(careItemList);
        }
        return rows;
    }

    /**
     * 修改护理计划
     *
     * @param carePlan 护理计划
     * @return 结果
     */
    @Transactional
    @Override
    public int updateCarePlan(CarePlan carePlan) {
        //获取当前后端登录用户
        Long userId = SecurityUtils.getUserId();
        //设置更新人
        carePlan.setUpdateBy(String.valueOf(userId));
        //设置更新时间
        carePlan.setUpdateTime(new Date());


        //先修改护理计划关联的项目 删除相关的所有关联关系
        int rows = carePlanMapper.deleteCarePlanItem(carePlan.getId());
        //修改护理计划表的内容
        rows += carePlanMapper.updateCarePlan(carePlan);
        //批量新增护理计划和项目的关联关系
        if (carePlan.getCarePlanItemList() != null && !carePlan.getCarePlanItemList().isEmpty()) {
            //为每项添加护理计划id
            for (CarePlanItem item : carePlan.getCarePlanItemList()) {
                item.setPlanId(Long.parseLong(carePlan.getId()));
            }
            rows += carePlanMapper.batchCarePlanItem(carePlan.getCarePlanItemList());
        }
        return rows;
    }


    /**
     * 删除护理计划信息
     *
     * @param id 护理计划主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteCarePlanById(String id) {
        //根据护理计划id 先删除护理计划表  然后删除他们的关联关系
        //删除护理计划关联的项目
        int rows = carePlanMapper.deleteCarePlanItem(id);
        //删除护理计划
        rows += carePlanMapper.deleteCarePlanById(id);
        return rows;
    }

    /**
     * 修改护理等级状态
     *
     * @param id 根据id修改护理等级状态
     * @return 返回影响行数
     */
    @Override
    public int changeStatus(Integer id, String status) {
        return carePlanMapper.changeStatus(id, status);
    }

    /**
     * 查询与护理计划关联的所有护理等级id
     *
     * @return 所有护理等级id列表
     */
    @Override
    public List<Long> getLevelIds() {
        return carePlanMapper.getLevelIds();
    }
}
